package com.terrier.utils
{

    /**
     * String的工具类. 提供一些对String的便捷操作
     * @author Jarvis.weng
     */
    public class WxStringUtility
    {
        /**
         * 将字符填充到指定长度,并返回新字符. 该方法不会对源字符做出修改
         * @param source 源字符
         * @param length 指定长度
         * @param char 填充用的字符. 如果提供了一个字符串作为参数,那么该方法只会使用该字串的第一个字符作为填充参数
         * @param prefix 该参数指定将字符填充到源字符串的开头还是结尾. 如果填充到开头,则为true;否则,为false
         * @return 填充完成后的字符串
         */
        public static function toFixed(source:String, length:int, char:String, prefix:Boolean = true):String
        {
            if (source.length >= length || char == null || char.length == 0)
            {
                return source;
            }

            if (char.length > 1)
            {
                char = char.charAt(0);
            }

            var len:int = length - source.length;
            var fixStr:String = "";

            while (fixStr.length < len)
            {
                fixStr += char;
            }

            return prefix ? fixStr + source : source + fixStr;
        }

        /**
         * 将源字符串中的参数字符转换为实际数据,返回一个新的字符串		</br>
         * 参数字符的格式为 {n},其中n是一个 整数索引值,取值范围是n大等于0;	</br>
         * 例子: var str:String = "{0}获得{1}个金币"; 		</br>
         * 调用translate(str, "玩家", 1000)后, 				</br>
         * 返回的结果是 "玩家获得1000个金币"; 					</br>
         * @param source 源字符串
         * @param args 实际数据
         * @return 转换后的新字符串
         */
        public static function translate(source:String, ... args):String
        {
            return translateWithArray(source, args);
        }

        /**
         * 将源字符串中的参数字符转换为实际数据,返回一个新的字符串		</br>
         * 参数字符的格式为 {n},其中n是一个 整数索引值,取值范围是n大等于0;	</br>
         * 例子: var str:String = "{0}获得{1}个金币"; 		</br>
         * 调用translate(str, "玩家", 1000)后, 				</br>
         * 返回的结果是 "玩家获得1000个金币"; 					</br>
         * @param source 源字符串
         * @param args 实际数据
         * @return 转换后的新字符串
         */
        public static function translateWithArray(source:String, args:Array):String
        {
            if (source == null)
            {
                return "";
            }
            var len:int = args.length;
            for (var i:int = 0; i < len; ++i)
            {
                var reg:RegExp = new RegExp("\{+" + i + "+\}", "g");
                source = source.replace(reg, args[i]);
            }
            return source;
        }

        /**
         * 从原始字符串中获得包含合法数字的子字串.
         * 这里的 合法数字的格式为 : (可选的正负号) + 数字 + (可选的小数点) + 数字;
         * 例如: +1234.235;  -23525.23;   345346;  63463.24;
         * @param str 原始字串
         * @return 包含合法数字的字串.  如果原始字串中不包含合法数字,则返回null
         */
        public static function getNumericString(str:String):String
        {
            var reg:RegExp = /[+-]?[0-9]*[.]?[0-9]*/;
            var strArray:Array = str.match(reg);
            var numStr:String = (strArray == null || strArray.length == 0) ? null : strArray[0];
            if (numStr == null)
            {
                return null;
            }
            // 缓存符号
            var sign:String = "";
            if (numStr.charAt(0) == "+" || numStr.charAt(0) == "-")
            {
                sign = numStr.charAt(0);
                numStr = numStr.substr(1);
            }
            // 删除前导的0
            reg = /^0+/;
            numStr = numStr.replace(reg, "");
            // 处理带有小数点的情况
            if (numStr.indexOf(".") != -1)
            {
                // 删除后缀多余的0
                reg = /0+$/;
                numStr = numStr.replace(reg, "");
                // 删除不必要的小数点
                reg = /[.]$/;
                numStr = numStr.replace(reg, "");
                // 如果为 .xxx的格式, 转换为 0.xxx 格式
                if (numStr.charAt(0) == ".")
                {
                    numStr = "0" + numStr;
                }
            }
            // 最终结果为空字符,转换为0
            if (numStr == "")
            {
                numStr = "0";
                sign = "";
            }
            return sign + numStr;
        }

        /**
         * 将字符串按照指定长度划分到一个数组.
         * @param str 字符串
         * @param len 长度
         * @return 划分好长度的字符串数组
         */
        public static function splitByLen(str:String, len:int):Array
        {
            var result:Array = [];
            while (str.length > 0)
            {
                var splitIndex:int = Math.max(str.length - len, 0);
                result.unshift(str.substr(splitIndex));
                str = str.substring(0, splitIndex);
            }
            return result;
        }
    }
}
